package glpm

import (
	"context"
	"fmt"
)

// PackageManager 包管理器接口
type PackageManager interface {
	// Name 返回包管理器名称
	Name() string
	
	// IsAvailable 检查包管理器是否可用
	IsAvailable() bool
	
	// Install 安装包
	Install(ctx context.Context, packages []string) error
	
	// Remove 移除包
	Remove(ctx context.Context, packages []string) error
	
	// Update 更新包列表
	Update(ctx context.Context) error
	
	// Upgrade 升级包
	Upgrade(ctx context.Context, packages []string) error
	
	// Search 搜索包
	Search(ctx context.Context, pattern string) ([]PackageInfo, error)
	
	// Info 获取包信息
	Info(ctx context.Context, packageName string) (*PackageInfo, error)
	
	// ListInstalled 列出已安装的包
	ListInstalled(ctx context.Context) ([]PackageInfo, error)
	
	// IsInstalled 检查指定包是否已安装
	IsInstalled(ctx context.Context, packageName string) (bool, error)
}

// PackageInfo 包信息结构体
type PackageInfo struct {
	Name         string `json:"name"`
	Version      string `json:"version"`
	Description  string `json:"description"`
	Architecture string `json:"architecture"`
	Status       string `json:"status"`
}

// ManagerType 包管理器类型
type ManagerType string

const (
	// OnlineManagerType 在线包管理器
	OnlineManagerType ManagerType = "online"
	// OfflineManagerType 离线包管理器
	OfflineManagerType ManagerType = "offline"
	
	// 包管理器类型常量
	ManagerTypeAPT     ManagerType = "apt"
	ManagerTypeYUM     ManagerType = "yum"
	ManagerTypeDNF     ManagerType = "dnf"
	ManagerTypeAPK     ManagerType = "apk"
	ManagerTypeDPKG    ManagerType = "dpkg"
	ManagerTypeRPM     ManagerType = "rpm"
	ManagerTypeZypper  ManagerType = "zypper"
	ManagerTypePacman  ManagerType = "pacman"
)

// ManagerConfig 包管理器配置
type ManagerConfig struct {
	Sudo           bool         `json:"sudo"`
	PreferredName  string       `json:"preferred_name"`
	ManagerType    ManagerType  `json:"manager_type"`
}

// NewManagerConfig 创建默认配置
func NewManagerConfig() *ManagerConfig {
	return &ManagerConfig{
		Sudo:          false,
		PreferredName: "",
		ManagerType:   OnlineManagerType,
	}
}

// String 返回包管理器类型的字符串表示
func (mt ManagerType) String() string {
	return string(mt)
}

// String 返回包信息的字符串表示
func (pi *PackageInfo) String() string {
	return fmt.Sprintf("PackageInfo{Name: %s, Version: %s, Description: %s, Architecture: %s, Status: %s}",
		pi.Name, pi.Version, pi.Description, pi.Architecture, pi.Status)
}

// Validate 验证管理器配置
func (mc *ManagerConfig) Validate() error {
	// 目前没有验证逻辑，总是返回nil
	return nil
}

// IsOnlineManager 检查管理器类型是否为在线管理器
func IsOnlineManager(mt ManagerType) bool {
	switch mt {
	case ManagerTypeAPT, ManagerTypeYUM, ManagerTypeDNF, ManagerTypeAPK, ManagerTypeZypper, ManagerTypePacman:
		return true
	default:
		return false
	}
}

// IsOfflineManager 检查管理器类型是否为离线管理器
func IsOfflineManager(mt ManagerType) bool {
	switch mt {
	case ManagerTypeDPKG, ManagerTypeRPM:
		return true
	default:
		return false
	}
}

// GetSupportedOnlineManagers 返回支持的在线包管理器列表
func GetSupportedOnlineManagers() []ManagerType {
	return []ManagerType{
		ManagerTypeAPT,
		ManagerTypeYUM,
		ManagerTypeDNF,
		ManagerTypeAPK,
		ManagerTypeZypper,
		ManagerTypePacman,
	}
}

// GetSupportedOfflineManagers 返回支持的离线包管理器列表
func GetSupportedOfflineManagers() []ManagerType {
	return []ManagerType{
		ManagerTypeDPKG,
		ManagerTypeRPM,
	}
}

// GetSupportedManagers 返回所有支持的包管理器列表
func GetSupportedManagers() []ManagerType {
	online := GetSupportedOnlineManagers()
	offline := GetSupportedOfflineManagers()
	return append(online, offline...)
}

// Error 包管理器错误类型
type Error struct {
	ManagerName string
	Operation   string
	Err         error
}

func (e *Error) Error() string {
	return fmt.Sprintf("包管理器 %s 执行 %s 操作失败: %v", e.ManagerName, e.Operation, e.Err)
}

func (e *Error) Unwrap() error {
	return e.Err
}

// NewError 创建新的包管理器错误
func NewError(managerName, operation string, err error) *Error {
	return &Error{
		ManagerName: managerName,
		Operation:   operation,
		Err:         err,
	}
}